function [best,fmin,N_iter]=bat_algorithm_new(inp)
clear
%%基本参数
if nargin<1
   inp=[20 100];    % 缺省popsize=20 ，MAXGEN=1000
end
popsize=inp(1);       % 种群数量，一般20-40
MAXGEN=inp(2);   % 最大迭代次数
loudness=0.5;            % 初始响度，可更大，搜索范围
pulse=0.1;           % 初始脉冲，可更大，搜索频度
alpha=0.75;     %音强衰减系数
gamma=0.1;      % 脉冲增加系数
Frequency_min=0;     % 频率最小
Frequency_max=2;     % 频率最大
iteration=0;            % I初始迭代次数
d=10;          %搜索维度---工序总数

%%========================种群初始化=======================================
frequency=zeros(popsize,1);   %频率20*1
velocities=zeros(popsize,d);      % 速度
position=zeros(popsize,d); %位置
fitness=zeros(popsize,1);  %适应度
position_new=zeros(popsize,d)   ;%更新时新位置

Lower_bounds=-5*ones(1,d);   %下界
Upper_bounds=5*ones(1,d);    %上界
for i=1:popsize
  position(i,:)=Lower_bounds+(Upper_bounds-Lower_bounds).*rand(1,d);
  fitness(i)=Fun(position(i,:));
end
% 找最优
[fmin,I]=min(fitness);%按适应度值排了序
best=position(I);

%%=================================迭代过程==============================

while (iteration<MAXGEN)
   % 计算响度和脉冲发散率
   pulse_r=pulse*(1-exp(-gamma*iteration));
   loudness=alpha*loudness;
  % 更新个体
   for i=1:popsize
       frequency(i)=Frequency_min+(Frequency_max-Frequency_min)*rand;%频率随机产生，受最优值影响速度程度
       velocities(i,:)=velocities(i,:)+(position(i,:)-best)*frequency(i);
       position_new(i,:)=position(i,:)+velocities(i,:);
  
       % 被最优值影响
   if rand<pulse_r
       position_new(i,:)=best+0.1*randn(1,d)*loudness;
   end

   % 检查新位置是否在范围内
   position_new(i,:)=simplebounds(position_new(i,:),Lower_bounds,Upper_bounds);
   % 计算新位置适应度
   fitness_new=Fun(position_new(i,:));
   % 新位置较好并且不太远则更新位置
    if ((fitness_new<=fitness(i)) && (rand>loudness))
       position(i,:)=position_new(i,:);
       fitness(i)=fitness_new;
    end
   % 更新最优
    if fitness_new<=fmin
       best=position_new(i,:);
       fmin=fitness_new;
    end
   end % 一个个体更新结束
  iteration=iteration+1;  % 迭代次数+1
  if ~mod(iteration,100) %每100代展示一次
     disp(strcat('Iteration = ',num2str(iteration)));    
    best  ,fmin 
  end
end  % 迭代结束
%%===============================输出结果==================================
%输出最好位置
disp(['Best =',num2str(best),' \n fmin=',num2str(fmin)]);

%%限界函数
function s=simplebounds(s,Lb,Ub)
  ns_tmp=s;
  I=ns_tmp<Lb;
  ns_tmp(I)=Lb(I);

  J=ns_tmp>Ub;
  ns_tmp(J)=Ub(J);

  
  s=ns_tmp;

% 适应度函数
function z=Fun(x)
z=sum(x.^2);